/*
 * $Id: NativeSupport.java 121 2012-01-22 01:40:14Z andre@naef.com $
 * See LICENSE.txt for license terms.
 */
package com.naef.jnlua;

/**
 * Loads the JNLua native library.
 * <p/>
 * The class provides and configures a default loader implementation that loads
 * the JNLua native library by means of the <code>System.loadLibrary</code>
 * method. In some situations, you may want to override this behavior. For
 * example, when using JNLua as an OSGi bundle, the native library is loaded by
 * the OSGi runtime. Therefore, the OSGi bundle activator replaces the loader by
 * a no-op implementaion. Note that the loader must be configured before
 * LuaState is accessed.
 */
public final class NativeSupport {
    // -- Static
    private static final NativeSupport INSTANCE = new NativeSupport();
    // -- State
    private Loader loader = new DefaultLoader();

    /**
     * Private constructor to prevent external instantiation.
     */
    private NativeSupport() {
    }

    // -- Construction

    /**
     * Returns the instance.
     *
     * @return the instance
     */
    public static NativeSupport getInstance() {
        return INSTANCE;
    }

    // -- Properties

    /**
     * Return the native library loader.
     *
     * @return the loader
     */
    public Loader getLoader() {
        return loader;
    }

    /**
     * Sets the native library loader.
     *
     * @param loader the loader
     */
    public void setLoader(Loader loader) {
        if (loader == null) {
            throw new NullPointerException("loader must not be null");
        }
        this.loader = loader;
    }

    // -- Member types

    /**
     * Loads the library.
     */
    public interface Loader {
        void load();
    }

    private class DefaultLoader implements Loader {
        @Override
        public void load() {
            try {
                LuaState.loadLibrary("^(lib)?jnlua");
            } catch (Error e) {
                LuaState.loadLibrary("^(lib)?lua");
                LuaState.loadLibrary("^(lib)?jnlua");
            }
        }

    }
}